Qt ne permet pas d’inclure du HTML dans un tableau ou un liste
Par contre, il est possible d’arriver à dessiner du “rich text” grâce à un delegate.
Pour ce qui est de l’implémentation d’un delegate, je vous épargne la théorie, c’est relativement facile, il n’y a qu’à voir les centaines d’exemples sur le web à ce sujet.
Cherchez ‘HTML OR “Rich text” Qt QStyledItemDelegate’ … ou quelque chose du genre pour y arriver, parce qu’effectivement, on doit hériter de QStyledItemDelegate.
Poiur ce qui est de la méthode paint() surchargée, voici un exemple fonctionnel :
void MyTableViewDelegate::paint(QPainter *a_pPainter
, const QStyleOptionViewItem &a_Option
, const QModelIndex &a_Index) const
{
QVariant value = a_Index.data();
if (value.isValid() && !value.isNull())
{
// On crée un document pour y écrire du HTML.
QTextDocument _Document;
QStyleOptionViewItemV4 _Options = a_Option;
initStyleOption(&_Options, a_Index);
// On enregistre le painter pour qu'il ne soit pas
// modifié à la fin de la méthode.
a_pPainter->save();
QString _Text = _Options.text;
// Pour voir la sélection, on met le texte en gras
// si l'item est sélectionné et que la vue a le focus.
if((a_Option.state & QStyle::State_Selected)
&& (a_Option.state & QStyle::State_HasFocus))
{
_Text = "<div style='color:"
+ a_Option.palette.highlightedText().color().name()
+ "; font-weight: bold;'>" + _Text + "</div>";
}
// On prends la peine de dessiner un document
// seulement s'il y a du HTML.
bool _MightBeRichText;
if(_MightBeRichText = Qt::mightBeRichText(_Text))
_Options.text = "";
// S'il y a du HTML, on dessine un controle vide.
// Sinon on garde le texte et on laisse tomber le document.
_Options.widget->style()->drawControl(QStyle::CE_ItemViewItem
, &_Options, a_pPainter, _Options.widget);
if(_MightBeRichText)
{
// On met le HTML dans le document (pas setText)
_Document.setHtml(_Text);
// On centre le document dans le contrôle.
QPoint _Point = a_Option.rect.center();
// On bouge le texte s'il y a une icône.
QSize _IconSize = _Options.icon.actualSize(_Options.rect.size());
_Point.setX(a_Option.rect.left()
+ _IconSize.width()
+ (_IconSize.width() > 1 ? 4 : 0));
// avec une petite marge (4px) pour avoir
// la même apparence que si on dessine
// le contrôle normalement.
int _TextHeight = _Document.size().height();
// On centre le texte verticalement.
_Point.setY(_Point.y() - (_TextHeight>>1));
a_pPainter->translate(_Point);
// Finalement on dessine le texte HTML.
_Document.drawContents(a_pPainter);
}
// Et on remet le painter comme il était au départ de la méthode.
a_pPainter->restore();
}
}
Voilà !
Ça fonctionne bien pour moi, si vous avez des commentaires, n’hésitez pas.



